package main

import (
	"fmt"
	"time"
)

/*
time.After() 超时一次之后，就不再使用的定时器
time.Tick() 每隔一段时间，就需要使用一次的定时器
time.Sleep()  阻塞住goroutinue的定时器，准确来说这个不算一个定时器\
time.Ticker() 可以自由控制定时器启动和关闭的定时器
*/

func main() {
	//after()
	tick()
}

func after()  {
	tchan := time.After(time.Second * 3)
	fmt.Println(time.Now().String(),"tchan type:%T", tchan)
	fmt.Println(time.Now().String(),"mark 1")
	fmt.Println(time.Now().String(),"tchan=", <-tchan) // channel里取出数据之后，会发现超时间是3秒
	fmt.Println(time.Now().String(),"mark 2")
}

func tick(){
	c := time.Tick(2 * time.Second)   //就是每隔2秒就能从这个channel获取一个数据
	for next := range c {
		fmt.Printf("%v \n", next)
	}
}

func ticker(){
	ticker := time.NewTicker(time.Second)
	defer ticker.Stop()
	done := make(chan bool)
	go func() {
		time.Sleep(5 * time.Second) // 5s后触发time.Stop，关闭ticker
		done <- true
	}()
	for {
		select {
		case <-done:
			fmt.Println("Done!")
			return
		case t := <-ticker.C:  //获取这个定时器的channel,然后取出数据
			fmt.Println("Current time: ", t)
		}
	}
}